lumen

Back To The Mac을 쓰는 기분이네요. 이런 프로젝트를 소개할 때는 말이죠.

화면의 밝기를 조절해 주는 Mac용 앱 프로젝트 입니다.

“자동으로 밝기 조절” 옵션을 disable 해 줘야 제대로 작동합니다.

2016/08/01 Today’s Best

anishathalye/lumen
_lumen - Magic auto brightness based on screen contents :bulb:_github.com

설치

기본적으로 binary를 제공합니다.

공식사이트에서

Lumen: Magic Auto Brightness Based on Screen Contents
_I do most of my software development in my terminal, with my trusty tmux / zsh / vim setup. When coding, I frequently…_www.anishathalye.com

다운로드 받아서 설치할 수 있습니다.

실행

실행하면 바로 MacOS의 status Bar에 해당 어플리케이션이 설치되고 Main Display 의 화면을 분석해서 색깔을 조절합니다.


소스 보기

anishathalye/lumen
_lumen - Magic auto brightness based on screen contents :bulb:_github.com

BrightnessController.m 파일이 대부분의 기능을 담당하고 있습니다.

AppDelegate.m 파일의 applicationDidFinishLaunching 을 살펴보면

- (void)applicationDidFinishLaunching:(NSNotification \*)aNotification {

self.statusItem = \[\[NSStatusBar systemStatusBar\] statusItemWithLength:NSVariableStatusItemLength\];

\[self.statusItem setMenu:self.statusMenu\];

\[self.statusItem setTitle:MENU\_SYMBOL\];

\[self.statusItem setHighlightMode:YES\];

self.brightnessController = \[\[BrightnessController alloc\] init\];

\[self.brightnessController start\];

\[self.toggle setTitle:STOP\];

}

brightnessController start

함수를 콜 하게 됩니다.

이 함수는 타이머를 실행시키는데 이 대부분이 링크 BrightnessController.m 파일에 작성되어 있죠.

타이머가 콜하는 tick은

(void)tick:(NSTimer \*)timer {

// 스크린의 밝기를 얻고

CGImageRef contents = \[self getScreenContents\];

if (!contents) {

return;

}

double lightness = \[self computeLightness:contents\];

CFRelease(contents);

// 백라이트가 수동으로 설정되었는지 확인한 후에

static bool noticed = false;

static float lastNoticed = 0;

float setPoint = \[self getBrightness\];

if (noticed || fabsf(self.lastSet --- setPoint) \> CHANGE\_NOTICE) {

if (!noticed) {

noticed = true;

lastNoticed = setPoint;

return; // 계속 바뀌는 치 체크

}

if (fabsf(setPoint --- lastNoticed) \> CHANGE\_NOTICE) {

lastNoticed = setPoint;

return; // it's still changing

} else {

\[self.model observeOutput:setPoint forInput:lightness\];

noticed = false;

// don't return, fall through and evaluate model here

}

}

float brightness = \[self.model predictFromInput:lightness\];

\[self setBrightness:brightness\];

}

마지막으로 계산된 값으로 밝기를 셋팅합니다.

관련된 계산식은 computeLightness 에 작성되어 있습니다.

double brightness = 0;

const unsigned int kSkip = 16; // uniformly sample screen pixels

// find RMS brightness value

if (data) {

for (size\_t y = 0; y < height; y += kSkip) {

for (size\_t x = 0; x < width; x += kSkip) {

const unsigned char \*dptr = &data\[(width \* y + x) \* 4\];

double l = srgb\_to\_brightness(dptr\[0\], dptr\[1\], dptr\[2\]);

brightness += l \* l;

}

}

}

**brightness = sqrt(brightness / (width \* height / (kSkip \* kSkip)));**

오늘은 왠일로 소스 분석까지 해 버렸네요. 아이쿵.

이런 코드 너무 좋아요~

By Keen Dev on August 1, 2016.

Exported from Medium on May 31, 2017.